@L|}6CD l0C)HCC WhL/h `CmCDiD`  R@P1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` D  C D     )16CS S)  C)D1 p p }0 C9DI pCDL~CiCDiD` DD˙` d J)L !}D L(( LL()  L| L( S LH 0p n  } CY?  q  L L  ` )} `A! d߰")-݆ "  $G@LLL&0") $G% }H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0 })8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH) }  hyhyB q L> Lm JJ  Ln*` dB%' }8  H H` 1 { LL   !L     Hh SY?  q  1L }  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF } G) *Gȩ GȽG GȌd q q G`  8   0G  `D}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y}`piH n0)բY? 08`0 }  0$L GGȽG L `8L`L}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR}1LJ舩9GIH`LJJ`HGHh l`} S gL   8 rii `дCDCG W  }C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}} |||DDOS DOSDOS SYS }}}}-}CDOS SYS} 0`BDELV !B }`LVUQ   ]   TU J ]L!T  #      TU  } L ? .  t`GBJ V~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI   0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -'}LLu DEHILV 9 .L( 9 .l  `` s$B VBH(}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVL)}1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2e*}1i1232435ޥ<<8} 3E:}DISK OPERATING SYSTEM II VERSION 2.0SModified f. ATMAS-IIA. DISK DIRECTORY I. FORMAT DISKB. => ATMAS-II J. D,}UPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRESSF. LOCK F-}ILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES9!&x#!7&p))'&X*./)L''-؆莟.}R'S  vW DEHHI 1A#! @ ~0ɛ8A0.) ȅ 1 1i/}il ! 1L NO SUCH ITEMSELECT ITEM OR FOR MENU! 0 .{z:*{}.|~ 1 0 00}JB 18L^%|DLl%DIRECTORY--SEARCH SPEC,LIST FILE? # 0 0 n&|D! 1L NOT A DISK FILE1}N !B 1L " 1 !BDED:}:1BJ|DE 1DEBH2}I 1 h0ߢ 0.  0?詛 1 ~0YЛ 1 "L<" "L 3} BL1TYPE "Y" TO DELETE...DELETE FILE SPECCOPY--FROM, TO?OPTION NOT ALLOWED COPYING---DN:4}# 0|D .L$A#B#C#JB|DE 1BHIDD#E 1D#0: B5} 1L B#C#C#B# B 1N#$0SYS1}:e#D# d# D# .d#ȽD# d# 𩛙d#X# 1,A#6}PdD#ELO- A.BJdD#E 1 1HH 0hh|DL^%1}:e# Lt% e#dD#EL%7} 1 0 . .0% 1L WILD CARDS NOT ALLOWED IN DESTINATION 0 A.|K@C}//3Hu ξL/L DRIVE TO WRITE DOS FILES TO?WRITING NEW DOS FILESTYPE "Y" TO WRITE DOS TO DRIVE 2.?}D2:DOS.SYSERROR - NOT VERSION 2 FORMAT. , &* բ( 1L `[) 0NΞ 0 L1M) 1@} L BAD LOAD FILELOAD FROM WHAT FILE?) 0 0#B 1L WHAT FILE TO LOCK?) 0 0$B 1L WHAT FILE TO UNLOCK?DUA}P DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO USE PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV. h  ,B}  `)  <0 2 2 0  ,   ,,ޢ* 1L ,K* 1 ~0 0C}FINSERT BOTH DISKS, TYPE RETURNERROR - DRIVES INCOMPATIBLE., 1 ~038  , 1L D}, &*  Lz+, 0 , 1 ~0 + Y,0!,0 ,L+ ,mm  v,"ǭE}0Ξ, 05,Lt+L +,Hh` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNF}INSERT DESTINATION DISK,TYPE RETURN`    `L,8,0( rG}L1(`ߢ) 1* 1 ~0Y`hhL S SL1) 8`NAME OF FILE TO MOVE?- 0 0|DLtH}% A., 1 <0 0 .@L# .BJ 1  DEHIB V L1 ,5 1 <0,L. I} JB|,A#Pd#DE 1 HI BDEHHII 1 B 1 , 1 <0,0Lf- B VJ},A#P, 1 <0 0L#L ߢ) 1* 1 ~0Yj383}mm ݭK}}`8}``|* ? ɛ,`|:(|/ 1L `DESTINATION CANT L}BE DOS.SYS0 0H{ $22Δ $28/L /) $2 Π $2 0 ξM}hAΞB,0 J 1 BޝDEHI,HDE 1HIHIDELSAVE-N}GIVE FILE,START,END(,INIT,RUN)O X0 1`BDEPHI V` X0H 1 L O}0 0 1L0`PLEASE TYPE 1 LETTER,0`hhL <0 1L0LA1 ,;ɛ7,"ɛ:ݦ1ݥP}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{Q}NAME TOO LONG B VL ` L1I H1EӝDL1|mDiE` V0`8d/8 i:"2!22 1R} L ERROR- 128ɛ+,' 20*.. өw2 1``2TOO MANY DIGITSINVALIDS} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4uT} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4uD2:DUP.SYSYV}W}X} E:}DISK OPERATING SYSTEM II VERSION 2.0SModified f. ATMAS-IIA. DISK DIRECTORY I. FORMAT DISKB. Y}=> ATMAS-II J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AZ}T ADDRESSF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES9!&x#!7&p))'&X[}*./)L''-؆莟R'S  vW DEHHI 1A#! @ ~0ɛ8A0.) ȅ\} 1 1iil ! 1L NO SUCH ITEMSELECT ITEM OR FOR MENU! 0 .{z:*{}.|~]} 1 0 0JB 18L^%|DLl%DIRECTORY--SEARCH SPEC,LIST FILE? # 0 0 n&|D! ^}1L NOT A DISK FILEN !B 1L " 1 !BDED:}:1BJ|DE 1DE_}BHI 1 h0ߢ 0.  0?詛 1 ~0YЛ`} 1 "L<" "L  BL1TYPE "Y" TO DELETE...DELETE FILE SPECCOPY--FROM, TO?OPTION NOT ALLOWEDa} COPYING---DN:# 0|D .L$A#B#C#JB|DE 1BHIDD#Eb} 1D#0: B 1L B#C#C#B# B 1N#$0SYS1}:e#D# d# D# .d#ȽD# d#c} 𩛙d#X# 1,A#PdD#ELO- A.BJdD#E 1 1HH 0hh|DL^%1}:e# Lt%d} e#dD#EL% 1 0 . .0% 1L WILD CARDS NOT ALLOWED IN DESTINATION 0 A.|K@C Der Parameter gibt dabei die Speicheradresse an, an der die ein- gegebene Hexzahl abgelegt wird. Die Zahl wird dabei im normalen 16-Bit} Integer-Format abgelegt. Beispiel: HEXIN AKKU1 AKKU1 DFW 0 In diesem Beispiel wird eine einge- gebene Zahl in AKKU1 abg}elegt. Sie koennten nun diese Zahl mit den Rechenroutinen aus ARITLIB verar- beiten. Wenn uebrigens mehr als vier Hex- Ziffe}rn (denn nur soviel passt ja in ein 16-Bit Integer) dann werden nur die zuletzt eingegeben Ziffern be- nutzt. Wenn ein Zeiche}n eingegeben wird, das keine Hex-Ziffer (0-9, A-F) ist, dann wird die Eingabe abge- brochen. HEXOUT: ======= Makro zur Aus}gabe einer vierstelligen Hex-Zahl. Sie muessen dem Makro wieder die Speicheradresse des auszugebenden Wortes uebergeben. Al}lgemeiner Aufruf: HEXOUT Beachten Sie, dass z.B. bei HEXOUT $E456 nicht der Wert 'E456' auf dem Bild- schirm ersc}heint, sondern das Wort, das sich in in den Speicherzellen $E456 und $E457 befindet. Damit zum BEISPIEL: ========= HEXOUT }AKKU1 AKKU1 DFW $E420 Wie gerade eben erlaeutert, wird die Zahl 'E420' ausgegen. Zur besseren Gestaltung des Demos wurde n}och das Makro PRINT aufge- nommen. Die Funktionsweise kennen Sie ja bereits aus der Arithmetik- Dokumentation }tation zu HEXLIB.SRC =====================================6************************************** * * * Hexadezimale Zahlen-Ein/Ausgabe * * * *******************************}******* KEYBDV EQU $E420 Keyboard-Handler EDITDV EQU $E400 Editor-Handler ************************************** * Ein} Zeichen ausgeben * * * : auszugebendes Zeichen ************************************** SCROUT MACRO JSR SCR1@ } JMP SCRE@ SCR1@ TAY ;simuliere LDA EDITDV+7 ;JMP SCROUT PHA LDA EDITDV+6 PHA TYA RTS SCRE@ MEND *******************}******************* * Ein Zeichen einlesen * * * * :enthaelt Zeichen * *******************}******************* GETCHR MACRO JSR GKEY@ JMP GEND@ GKEY@ LDA KEYBDV+5 simuliere PHA ;JMP GETCHR LDA KEYBDV+4 PHA R}TS GEND@ MEND ************************************** * HEX-INPUT ROUTINE * * * * liest eine bis zu vierstellige Hex-* }* Zahl in die Zellen EXPR (LSB) und * * EXPR+1 (MSB) ein * ************************************** HEXIN MACRO EXPR LDX #}0 ;Ergebnis loeschen STX EXPR STX EXPR+1 HIN1@ GETCHR ;Zeichen lesen SCROUT ;auch ausdrucken CMP '0 ;umwand}eln BCC HIN4@ CMP '9+1 BCC HIN2@ CMP 'A BCC HIN4@ CMP 'F+1 BCS HIN4@ SBC 'A-10-1 HIN2@ ASL ASL ASL ASL LDX #4 } ;bisheriges Ergeb. HIN3@ ASL ;um vier Binaer- ROL EXPR ;Stellen verschieben ROL EXPR+1 ;neue Ziffer mit DEX ;hinein}shiften BNE HIN3@ BEQ HIN1@ HIN4@ EQU * MEND ************************************** * HEX-OUTPUT * * * * gibt den I}nhalt der Speicherzellen * * EXPR (LSB) und EXPR+1 (MSB) in * * hexadezimaler Form aus * ********************}****************** HEXOUT MACRO EXPR LDA EXPR+1 ;erst das MSB JSR PRB@ ;Byte ausgeben LDA EXPR ;dann das LSB JSR }PRB@ JMP HOT4@ ;fertig * * Ein Byte hexadezimal ausgeben * PRB@ PHA ;merken LSR ;erst hoher- LSR ;werige Ziffer} LSR LSR JSR HOT1@ PLA ;und die unteren AND #%00001111 ;vier Bits HOT1@ CMP #10 BCS HOT2@ ORA '0 BNE HOT3@ HOT2@ A}DC 'A-10-1 HOT3@ SCROUT RTS HOT4@ EQU * MEND ************************************* * PRINT-Makro (mit SCROUT!) ***********}************************** PRINT MACRO STRING JMP PR1@ TEXT@ ASC STRING ZEIG@ DFB 0 PR1@ LDX #$FF STX ZEIG@ PR2@ INC ZEIG}@ LDX ZEIG@ LDA TEXT@,X AND #$7F SCROUT LDX ZEIG@ LDA TEXT@,X BPL PR2@ MEND ************************************** *} DEMO-PROGRAMM * * * * Der Inhalt einer Speicherzelle wird* * ausgedruckt (aehnl. DPEEK) * * Eingabe der Adresse in He}x * ************************************** ORG $A800 AKKU1 EQU $D4 AKKU2 EQU $D6 PRINT \Adresse eingeben: $\ HEXIN AKK}U1 LDY #0 LDA (AKKU1),Y STA AKKU2 INY LDA (AKKU1),Y STA AKKU2+1 PRINT \Inhalt (Wort) : $\ HEXOUT AKKU2 RTS }en-Ein/Ausgabe * * * *******************************B===================================== Arithmetik-Bibliothek fuer ATMAS-II =================}==================== In der Arithmetik-Makro Bibliothek finden Sie viele hilfreiche Makros, wenn Sie mit Dezimalzahlen im B}ereich von 0 bis 65535 rechnen wollen, oder eine Ein- bzw. Ausgabe von Zahlen benoetigen. Ein Demo, das Ihnen die Moeglich- }keiten dieser recht leistungsfaehigen Makrosammlung naeherbringt, ist am Ende von ARITLIB enthalten. Laden Sie daher ARITLIB.}SRC mit ATMAS-II und assemblieren Sie es. Nun koennen Sie das Demo im Monitor mit 'G'oto A800 starten. Die einzelnen Makr}os koennen z.B. mit Hilfe des Kopierregisters in eigenen Programme uebernommen werden. Wenn Sie die Ein-/ Ausgabe-Makros DECI}N, DECOUT oder PRINT verwenden, so muessen Sie immer die Makros SCROUT und GETCHR mit uebernehmen. Zur Optimierung des Speich}erbedarfes koennen Sie die Ueberschriften loeschen. Auf Kommentierung wurde bei den Makros verzichtet, da das zuviel wertvoll}en Platz verschenkt. Anschliessend folgt eine genauere Beschreibung der einzelnen Makros: SCROUT: ======= Dieses Makro gib}t das im Akku be- findliche Zeichen auf den Bild- schirm aus. Die etwas seltsam an- mutende Codierung hat einen wichtigen Gru}nd: Das SCROUT-Makro laeuft auf allen ATARI-Computern, also sowohl auf den alten 400/800, wie auch auf der XL/XE-Serie. Die }ROM-Routine zur Ausgabe von Zeichen wird dabei nicht direkt mit einem JSR aufgerufen, sondern auf dem Umweg ueber die Handler}-Tabelle des Editors aktiviert. Da diese Tabelle bei allen Computern an der selben Stelle im ROM steht gibt es keine Probleme} mit der Kompatibilitaet. SCROUT ist eigentlich als internes Makro fuer die DECIN, DECOUT sowie PRINT-Makros angelegt worden}, Sie koennen es aber selbstverstaendlich auch fuer andere Zwecke verwenden (z.B. zur Ausgabe eines EOL's: LDA #$9B SCROUT} GETCHR: ======= Wie SCROUT handelt es sich hierbei auch um ein internes Makro. Es dient zur Eingabe eines einzelnen Zeiche}ns von der Tastatur, aehnlich einem GET-Befehl in BASIC. Auch vom Aufbau her gleicht es SCROUt, nur dass diesmal die Handler-}Tabelle des Keyboard-Handlers (ab $E420) benutzt wird. Vielleicht sollte noch bemerkt werden, dass ein mit GETCHR einge- les}enes Zeichen nicht automatisch am Bildschirm erscheint. Verwenden Sie dazu das SCROUT-Makro gleich im Anschluss an GETCHR. }DECIN: ====== Dieses Makro dient zur Eingabe einer Dezimalzahl im Bereich von 0 bis 65535. Verwendung: DECIN }Der Parameter steht dabei fuer eine Speicheradresse, ab der das Ergebnis abgelegt wird. Da mit DECIN immer ein Zwe}i-Byte (Integer-) Wert eingelesen wird, belegt das Ergebnis immer zwei Bytes. Es empfiehlt sich, Platz fuer das Ergebnis mit }dem DFW- Befehl zu reservieren. DECIN AKKU1 ... AKKU1 DFW 0 Dieses Beispiel legt einen einge- gebenen Wert in der Speic}herzelle AKKU1 (das niederwertige Byte) und in AKKU2 (das MSB) ab. DECOUT: ======= Mit DECOUT wird eine Integerzahl auf de}m Bildschirm ausgegeben. Wie bei DECIN wird die auszugebende Zahl wieder mit Hilfe eines Makro- parameters angegeben. Verwend}en Sie daher DECOUT wie folgt: DECOUT AKKU1 ... AKKU1 DFW 12345 Der allgemeine Aufruf lautet DECOUT ist wieder die Speicher- adresse des auszugebenden Zwei-Byte Wertes. DECOUT arbeitet uebrigens nach einem aehnlichen Alg}orithmus wie BINDEZ1. ADD: ==== addiert zwei 16-Bit Integerzahlen, deren Speicheradressen mit Makro- parametern uebergeben} werden. Allgemeiner Aufruf: ADD , Das Ergebnis befindet sich an- schliessend in . Beispiel: ADD AKK}U1,AKKU2 ... AKKU1 DFW 100 AKKU2 DFW 200 liefert den Wert 300 in AKKU1. SUB: ==== subtrahiert zwei 16-Bit Integers. Arbei}tsweise gleich wie ADD Allgemeiner Aufruf: SUB , Ergebnis in MUL: ==== Multipliziert zwei Integers }mit- einander. Allgemeiner Aufruf: MUL , Das Ergebnis befindet sich in . DIV: ===== Erledigt die Divi}sion zweier Intergers. Neben dem eigentlichen Ergebnis wird noch ein evtl. aufge- tretener Rest zur Verfuegung gestellt. All}gemeiner Aufruf: DIV ,, Das Ergebnis der Division befindet sich wiederum in , der Rest in } Beispiel: DIV AKKU1,AKKU2,AKKU3 ... AKKU1 DFW 1000 AKKU2 DFW 27 AKKU3 DFW 0 Dieses Beispiel dividiert 1000 durch 27. Das} Ergebnis findet sich in AKKU1, der Rest in AKKU3. PRINT: ====== Dieses Makro gibt einen String am Bildschirm aus. Die Ar}beitsweise ist aehnlich dem PRINT Unterprogramm, das in einem eignen Dokument be- schrieben ist. Aufruf: PRINT \Das ist ein }Text\ Wichtig ist, dass Sie immer den Rueckwaerts-Schraegstrich als Trenn- Zeichen verwenden, da PRINT das letzte Zeichen in}vertiert erwartet. ===========r************************************** * * * Arithmetik Makros * * * ************************************** KEYBD}V EQU $E420 Keyboard-Handler EDITDV EQU $E400 Editor-Handler * * zuert einige wichtige Makros zur * Ein- und Ausgabe von Zei}chen: * ************************************** * Ein Zeichen ausgeben * * Zeichen wird im Akku erwartet ****************}********************** SCROUT MACRO JSR SCR1@ JMP SCRE@ SCR1@ TAY LDA EDITDV+7 PHA LDA EDITDV+6 PHA TYA RTS SCRE@ MEN}D ************************************** * Ein Zeichen einlesen * * Zeichen kommt im Akku zurueck *********************}***************** GETCHR MACRO JSR GKEY@ JMP GEND@ GKEY@ LDA KEYBDV+5 simuliere PHA ;JMP GETCHR LDA KEYBDV+4 PHA RTS G}END@ MEND ************************************* * Makro zur Eingabe einer Dezimalzahl * * Aufruf: DECIN * * Zahl wird }in (LSB) und * (MSB) abgelegt ************************************** DECIN MACRO EXPR LDX #0 STX EXPR STX E}XPR+1 DEC1@ GETCHR SCROUT CMP '0 BCC DEC4@ CMP '9+1 BCS DEC4@ AND #%00001111 LDX #17 BNE DEC3@ DEC2@ BCC *+4 ADC #10}-1 LSR DEC3@ ROR EXPR+1 ROR EXPR DEX BNE DEC2@ BEQ DEC1@ DEC4@ EQU * MEND ************************************** * Ma}kro zur Ausgabe einer Dezimalzahl * mit fuehrenden Nullen. * * Aufruf: DECOUT * * und werden am Bild- * }schirm 5-stellig ausgegeben ************************************** DECOUT MACRO EXPR LDY #7 DEC1@ LDX '0 DEC2@ SEC LDA EXPR} SBC DTAB@-1,Y PHA DEY LDA EXPR+1 SBC DTAB@+1,Y BCC DEC3@ STA EXPR+1 PLA STA EXPR INX INY BNE DEC2@ DEC3@ PLA TX}A STY TEMP@ SCROUT LDY TEMP@ DEY BPL DEC1@ LDA EXPR ORA #'0 SCROUT JMP DEC4@ TEMP@ DFB 0 * * Tabellen der Zehnerpot}enzen * DTAB@ DFW 10 DFW 100 DFW 1000 DFW 10000 DEC4@ EQU * MEND ************************************** * Makro zur 16}-Bit Addition * * Aufruf ADD , * * Arbeitsweise:EXPR1 := EXPR1 + EXPR2 ************************************** }ADD MACRO EXPR1,EXPR2 CLC LDA EXPR1 ADC EXPR2 STA EXPR1 LDA EXPR1+1 ADC EXPR2+1 STA EXPR1+1 MEND *******************}******************* * Makro zur 16 Bit Subtraktion * * Aufruf: SUB , * * Arbeitsweise:EXPR1 := EXPR1 - EXPR2 * }************************************** SUB MACRO EXPR1,EXPR2 SEC LDA EXPR1 SBC EXPR2 STA EXPR1 LDA EXPR1+1 SBC EXPR2+1 } STA EXPR1+1 MEND ************************************** * Makro zur 16-Bit Multiplikation * * Aufruf: MUL , * }* Arbeitsweise:EXPR1 := EXPR1 * EXPR2 * ************************************** MUL MACRO EXPR1,EXPR2 JMP MUL0@ HILF@ DFW 0 }MUL0@ LDX #0 STX HILF@ STX HILF@+1 LDY #16 BNE MUL2@ MUL1@ CLC LDA HILF@ ADC EXPR2 STA HILF@ LDA HILF@+1 ADC EXPR2+1} STA HILF@+1 MUL2@ LSR HILF@+1 ROR HILF@ ROR EXPR1+1 ROR EXPR1 DEY BMI MUL3@ BCC MUL2@ BCS MUL1@ MUL3@ EQU * MEND *}************************************* * Makro zur 16-Bit Division * * Aufruf: DIV ,, * * Arbeitsweise: * } = / (Erg.) * = MOD (Rest) ************************************** DIV MACRO EXP}R1,EXPR2,REST LDX #0 STX REST STX REST+1 LDY #16 DIV1@ ASL EXPR1 ROL EXPR1+1 ROL REST ROL REST+1 SEC LDA REST SBC E}XPR2 TAX LDA REST+1 SBC EXPR2+1 BCC DIV2@ STX REST STA REST+1 INC EXPR1 DIV2@ DEY BNE DIV1@ MEND ******************}******************* * PRINT-Makro (mit SCROUT!) * * Aufruf: PRINT \Text\ * * Achtung:unbedingt '\' verwenden! ***************}********************** PRINT MACRO STRING JMP PR1@ TEXT@ ASC STRING ZEIG@ DFB 0 PR1@ LDX #$FF STX ZEIG@ PR2@ INC ZEIG@ L}DX ZEIG@ LDA TEXT@,X AND #$7F SCROUT LDX ZEIG@ LDA TEXT@,X BPL PR2@ MEND ************************************** * DEM}O-PROGRAMM * * Division zweier Zahlen ************************************** ORG $A800 * * einige Arbeitsregister festlegen} * AKKU1 EQU $600 AKKU2 EQU $602 AKKU3 EQU $604 * * jetzt geht's los * PRINT \Zahl eingeben: ?\ DECIN AKKU1 PRINT \Geteilt} durch ?\ DECIN AKKU2 * * Division: * DIV AKKU1,AKKU2,AKKU3 * * und Ausgabe * PRINT \Das ergibt :\ DECOUT AKKU1 PRINT} \ Rest :\ DECOUT AKKU3 RTS ******************* KEYBDc===================================== Dokumentation zu BINDEZ1.SRC BINDEZ2.SRC ========== }=========================== Die Ausgabe von Dezimalzahlen in Assemblerprogrammen ist leider nicht so einfach, wie man das vo }n BASIC her gewohnt ist. Aus diesem Grund werden Ihnen in der ATMAS-Toolbox zwei verschiedene Moeglichkeiten der Zahlenausga }be vorgestellt. Da waere zum einen die Benutzung von ROM-Routinen (in BINDEZ1.SRC), zum anderen aber auch eine sehr schnelle }Methode (in BINDEZ2, die sich besonders zur Ausgabe von Punktestaenden in Spielen eignet. METHODE1: Floating Point ======== }================ Der eine Weg zur Ausgabe einer Zahl fuehrt, wie oben schon angedeutet, ueber das Betriebssystem des Atari- !}Computers. Insgesamt drei Funktionen werden benoetigt: 1) Wandlung von der Integer in die Floating-Point (Fliesskomma-) D!}ar- stellung, denn sicherlich wird die auszugebende Zahl nicht schon in diesem recht komplexen Format vorliegen. !} 2) Wandlung der Integer-Darstellung in einen ATASCII-String. In BASIC entspraeche dieser Schritt der STR$-Funktion !} 3) Ausgabe des gerade eben erzeugten Strings auf dem Bildschirm. Dazu benutzt man folgende Betriebs- system-Routinen: I!}FP ($D9AA):Wandelt Integer nach FP, Integer in FR0 ($D4) und FR0+1, FP ist danach eben- falls in !}FR0 - FR0+5 FASC($D8E6):Wandelt FP in String, FP wird in FR0 erwartet, der Zeiger INBUFF ($F3) zeigt auf den gew!}andelten String. Das letzte String- ist invers (hoechst- wertiges Bit gesetzt) CIO ($E456):Bildschirmausgabe ueb!}er IOCB 0, diese Allzweck- routine ist Ihnen ja sicherlich schon bekannt. Im Programm BINDEZ1.SRC finde!}n Sie ein Beispiel fuer diesen Weg der Zahlenausgabe. Sie sehen dabei einen Zaehler in der Bildmitte, der mit maximaler Gesch! }windigkeit hochzaehlt. METHODE 2: Subtraktionsmethode ============================== Die oben beschriebene Art der Zahlen-! } ausgabe eignet sich allerdings weniger fuer Spiele, da der Umweg ueber die Fliesskomma-Arithmetik doch recht viel Zeit koste! }t. Schneller geht, wenn man die Wandlung nicht dem Betriebssytem ueberlaesst, sondern eine selbstgestrickte Routine einsetzt! }, wie im Programm BINDEZ2.SRC geschehen. Der Algorithmus: ---------------- Dieses Programm arbeitet nach einem recht effizi! }enten Algorithmus, der nur mit Additionen und Subtraktionen auskommt. Und das geht so: Gewandelt werden wieder 2-Byte Intege!}rs mit einem Zahlenbereich von 0 bis 65535. Grundlage der Berechnung sind die Tabellen DECLO und DECHI, die alle Zehnerpotenz!}en dieses Bereiches (10,100,1000 und 10000) enthalten. Von der zu wandelnden Zahl wird nun die hoechste Zehnerpotenz (10000)!} abgezogen, so lange, bis das Er- gebnis kleiner als 10.000 ist. Die Anzahl der Subtraktionen gibt die Ziffer, die an die Zeh!}ntausender- stelle einzutragen ist. Das Spielchen wird fuer alle Potenzen von 10 wiederholt, bis am Ende nur noch die Einerst!}elle uebrigbleibt. Die Zahl wird dabei (indem der Aus- gabebuffer ZIFFER mit $10 vorbe- setzt wird) in Bildschirmcode ge- wa!}ndelt, um den gewandelten String direkt in den Videospeicher ueber- tragen zu koennen. Moechten Sie lieber einen ATASCII- St!}ring haben, dann bitte mit $30 vorbesetzen. DEMO ---- Das im Programm BINDEZ2.SRC ent- haltene Demo erzeugt wieder einen Za!}ehler, der mit hoechster Ge- schwindigkeit zaehlt. Allerdings geht's diesmal etwa 15 mal schneller als in BINDEZ1. !}1.SRC BINDEZ2.SRC ========== T************************************* * Zahlenausgabe in Assembler * * * * mit der FLOATING-POINT PACKAGE %} * ************************************* * * Konstante fuer Floating-Point * FASC EQU $D8E6 FP nach ASCII IFP EQU $D9AA Inte%}ger nach FP FR0 EQU $D4 FP-Akku 0 INBUFF EQU $F3 Zeiger auf ASCII-Ergebnis * * IOCB-Konstante * CIOV EQU $E456 ICCOM EQU $3%}42 ICBAL EQU $344 ICBAH EQU $345 ICBLL EQU $348 ICBLH EQU $349 * * CIO-Befehlscode * CPBIN EQU 11 Get Binary Record * * Curs%}orsteuerung * ROWCRS EQU $54 Cursor-Zeile COLCRS EQU $55 Cursor-Spalte CRSINH EQU $2F0 Cursor ein=0/aus=1 ******************%}******************** * Testprogramm:Zaehler am Bildschirm ************************************** * ORG $A800 im res. Bereich%} * TEST LDA #0 Zaehlung beginnt STA ZAHL bei Null STA ZAHL+1 LDA #1 Cursor aus STA CRSINH ZAEHLER LDA ZAHL zu wandel%}nde LDX ZAHL+1 Zahl uebergeben JSR BINASC umwandeln LDX #18 in die Mitte LDY #11 des Bildschirmes JSR PRINT ausgeben %}INC ZAHL und weiterzaehlen BNE ZAEHLER INC ZAHL+1 auch das MSB JMP ZAEHLER Endlose Schleife=> ZAHL DFW 0 Zaehl-Register % } ************************************** * Wandlung Binaer nach ATASCII * : LSB, :MSB **********************************%!}**** BINASC STA FR0 Zahl in FP-Register STX FR0+1 Nr. 0 eintragen JSR IFP in FP umwandeln JSR FASC FP in ATASCII RTS %"}umwandeln ************************************** * Ausgabe der Zahl auf Bildschirm * ueber CIO-Interface * :Spalte :Z%#}eile ************************************** PRINT STX COLCRS POSITION ausfuehern STY ROWCRS LDX #0 STX COLCRS+1 MSB der %$}Spalte STX ICBLL nur 1 Zeichen STX ICBLH ausgeben STX INBPTR INBUFF-Zeiger auf Null LDA #CPBIN Zeichenausgabe STA ICCOM %%} NXTCHR LDY INBPTR Zeiger in INBUFF LDA (INBUFF),Y Zeichen aus Buffer BMI PRTEND letztes Zeichen JSR CIOV ausgeben INC I%&}NBPTR Zeiger weiter JMP NXTCHR und naechstes-> * * Letztes Zeichen: 8.Bit loeschen u. ausgeben * PRTEND AND #$7F Hi-Bit loe%'}schen JSR CIOV und Zeichen 'raus RTS INBPTR DFB 0 Index fuer INBUFF %(}abe in Assembler * * * * mit der FLOATING-POINT PACKAGE $3************************************ * Zahlenausgabe in Assembler * ************************************ * VDLSTL EQU $)*}230 Display-List Zeiger BZAHL EQU $D4 Hilfsregister in Zeropage ORG $A800 im reservierten Bereich ************************)+}************** * Testprogramm: Zaehler am Bildschirm ************************************** TEST CLD wir rechnen binaer LDA),} #0 Zaehlung beginnt STA ZAHL bei Null STA ZAHL+1 JSR SETDL Display-List ZAEHLER LDA ZAHL Zaehlerinhalt LDX ZAHL+1 )-}an Wandelprogramm JSR BINDEZ umwandeln LDY #13 zentrieren JSR PRINT ausgeben INC ZAHL und weiterzaehlen BNE ZAEHLER I).}NC ZAHL+1 auch das MSB JMP ZAEHLER * ZAHL DFW 0 Zaehler-Register ************************************** * Wandlungsroutine )/}Binaer in Dezimal * : LSB, :MSB ************************************** BINDEZ STA BZAHL Parameter speichern STX BZAHL)0}+1 LDX #4 VORBES LDA #$10 Ausgabebuffer STA ZIFFER,X mit B.-Code fuer DEX Null vorbesetzen BPL VORBES LDX #0 Stellen)1}zaehler STELLE LDA BZAHL+1 Zehner-Potenz CMP DECHI,X groesser als BNE TSTHI restliche Zahl? LDA BZAHL CMP DECLO,X TSTHI )2}BCC KLEINER Potenz zu gross * * Zehner-Potenz abziehen, Ziffer erhoehen * SEC LDA BZAHL die aktuelle SBC DECLO,X Zehnerpot)3}enz STA BZAHL abziehen LDA BZAHL+1 SBC DECHI,X STA BZAHL+1 INC ZIFFER,X Ziffer erhoehen JMP STELLE gleiche Stelle nochm)4}al * * kleinere Zehnerpotenz anwaehlen * KLEINER INX schon vier Stellen CPX #4 bearbeitet? BNE STELLE nein -> * * nur noc)5}h Einerstelle da * CLC Einerstelle LDA BZAHL in Ausgabebuffer ADC ZIFFER+4 addieren STA ZIFFER+4 RTS * * Tabellen der Z)6}ehnerpotenzen * getrennte Tabellen f. LSB und MSB * DECLO DFB 10000,1000,100,10 DECHI DFB 10000/256,1000/256,0,0 * * Ausgabeb)7}uffer * ZIFFER ASC %00000% ************************************** * Gewandelte Zahl aus ZIFFER in den * Bildschirm kopieren )8}* :letzte Spalte ************************************** PRINT LDX #4 5 Zahlen NZIF LDA ZIFFER,X aus Buffer STA BLDRAM,Y )9}in Bildschirm DEY DEX BPL NZIF naechste --> RTS ************************************** * Spezial-Displaylist aus einer ):}Zeile ************************************** SETDL LDA #DLIST Zeiger auf STA VDLSTL neue Display- LDA #DLIST/256 list eintr);}agen STA VDLSTL+1 RTS * * Display-List * DLIST DFB $70,$70,$70,$70 DFB $70,$70,$70,$70 DFB $47 GRAPHICS 2 DFW BLDRAM D)<}FB $41 Sprung auf DFW DLIST Anfang der D.-List * * Video-Ram (20 Bytes lang) * ASC erzeugt hier Bildschirmcode! * BLDRAM AS)=}C % SCORE: % *embler * ************************************ * VDLSTL EQU $(<===================================== Dokumentation zu PRINT.SRC ===================================== Das P-?}RINT Unterprogramm benuetzt den Stack, um eine recht elegante Text- ausgabe in Maschinensprache moeglich zu machen. Normaler-@}weise, wenn Sie z.B eine Textausgabe mit CIO machen (wie in IOLIB auf der ATMAS Diskette), koennen Sie den Text nicht direkt -A}ins Assemblerprogramm einfuegen, da der Text sonst als vermeintliche Assemblerbefehle interpretiert wuerde. Da hilft es nur,-B} den Text etwa ganz am Ende des Programmes unterzubringen, oder den String im Programm mit einem vorangstellten JMP-Befehl zu-C} umgehen. Beispiel -------- Wesentlich eleganter geht das mit dem PRINT-Unterprogramm. Hier koennen Sie den Text gleich ans-D}chliessend an den UP-Aufruf z.B. mit einem ASC-Befehl angeben: JSR PRINT ASC \Das ist ein Beispiel\ LDA #0 Fortsetzung d-E}es PGMs PRINT sorgt dafuer, dass der ge- wuenschte Text ausgedruckt wird, und setzt die Programmbearbeitung mit dem der ASC--F}Anweisung folgenden Befehl fort (im Beispiel mit LDA #0). Wie funktioniert's? ------------------- Wenn ein Unterprogramm au-G}fgerufen wird, merkt sich der Computer die Ruecksprung-Adresse (also die Adresse an der das Programm nach einem RTS fortgeset-H}zt wird) auf dem Stack. In der PRINT-Routine machen wir uns das zunutze. PRINT stellt zu Anfang durch zwei PLA-Befehle fest, -I}von welcher Adresse der Aufruf gekommen ist. Die so gewonnenen Adresse wird erst einmal im Zeropage-Register ZEIGER festgehal-J}ten. Nun wird ZEIGER zuerst um eins erhoeht, da die Ruecksprungadresse immer auf das letzte Byte des JSR- Befehles zeigt. Je-K}tzt kann Zeichen fuer Zeichen aus dem String gelesen und auf den Bildschirm ausgegeben werden (mit SCROUT, naehere Erklae- ru-L}ng siehe ARILIB). Das Ende des Strings wird erkannt, wenn das Bit 7 eines Zeichens gesetzt ist. Daher wurde im ASC-Befehl das-M} '\'-Zeichen als Begrenzer verwendet, der den String passend (letztes Zeichen mit Bit 7 = 1, s. Handbuch) ablegt. Bevor das -N}erloesende RTS erfolgen darf, muss die korrigierte Rueck- sprungadresse wieder auf den Stack zurueck. Anmerkung: ---------- -O} Leerzeilen kann man einfach mit dem SCROUT-Unterprogramm erzeugen: LDA #$9B JSR SCROUT Auf die in der SCROUT-Routine ver-P}- wendete Technik wird uebrigens in ARITLIB.DOC naeher eingegangen Bildschirm loeschen: LDA #$7D JSR SCROUT -Q}ion zu PRINT.SRC ===================================== Das P,9************************************** * * * Trickreiche Ausgabe von Texten * * * * * durch STACK-Manipulationen1S} * * * ************************************** AUX EQU $80 ;Zeropage-Register * * Adressen der Handlertabellen im ROM *1T} KEYBDV EQU $E420 ;Keyboard-Handler EDITDV EQU $E400 ;Editor-Handler * * Im reservierten Bereich: * ORG $A800 * * Zuerst ein1U} kleines Beispiel * BEISPIEL JSR PRINT ASC \Das ist ein Beispiel\ RTS ************************************* * Das PRINT-Un1V}terprogramm ************************************* PRINT PLA ;Aufrufadresse STA AUX ;holen PLA STA AUX+1 LDX #0 PRI1W}NT1 INC AUX ;naechtes Zeichen BNE *+4 INC AUX+1 LDA (AUX,X) ;Zeichen holen AND #$7F ;KEIN INVERS! JSR SCROUT ;Au1X}sgabe LDX #0 LDA (AUX,X) ;nochmal Zeichen BPL PRINT1 ;noch eins da-> LDA AUX+1 ;Stack berichtigen PHA LDA AUX PHA 1Y}RTS ;Ciao ... ************************************** * Ein Zeichen ausgeben * *****************************1Z}********* SCROUT TAY simuliert LDA EDITDV+7 einen indirekten PHA Sprung nach LDA EDITDV+6 der SCROUT-Routine PHA im OS1[}-ROM TYA RTS *********** * * * Trickreiche Ausgabe von Texten * * * * * durch STACK-Manipulationen0===================================== Dokumentation zu FSCROLL.SRC ===================================== D5]}as seidenweiche Verschieben von Bildschirmgraphiken gehoert zu einer der staerksten Faehigkeiten, die der Atari-Computer zu b5^}eiten hat. Leider ist das sog. Fine-Scrolling nicht so ganz einfach zu prgrammieren, in BASIC ohne unterstuetzendes Maschine5_}nprogramm ganz und gar un- moeglich. Das Programm FSCROLL zeigt Ihnen, wie eine vertikale Bildverschiebung in Assembler prog5`}rammiert werden kann. Zur Demonstration wurde ein GRAPHIS 2 Bildschirm gewaehlt, der als Bildfenster in das O.S.-ROM dient. D5a}ieses Fenster kann mit einen Joystick in Port 1 nach oben und unten bewegt werden. Die recht wirr erscheinenden Zeichen, die 5b}Sie dabei am Bildschirm sehen, entstehen dadurch, dass der Inhalt des O.S.-ROMs als Videospeicher zweckentfremdet wird. Sie s5c}ehen deher den Zeichensatz (am Anfang) und die Maschinen-Routinen des Betriebs- systems auf dem Schirm vorueber ziehen. Zum 5d}Ausprobieren des Programmes wie ueblich FSCROLL.SRC laden, assem- blieren und im Monitor mit 'G'oto A800 starten SCROLLING 5e}UND ZUBEHOER ---------------------- Eine Feinverschiebung des Bildschirms wird erst durch den VBI (Vertical Blank Interru5f}pt) moeglich. Diese Programm-Unterbrechung, die alle 1/50 Sekunden ausgeloest wird (immer dann, wenn der Elektronenstrahl im 5g}Fernsehgeraet ein komplettes Bild vollendet hat), ermoeglicht Aende- rungen der Graphik ohne Stoerungen und Flimmern. Die Bi5q}B'DOS SYSB*+DUP SYSB-UMEM SAVBAUTORUN SYSbHEXLIB DOCbHEXLIB SRCb'ARITLIB DOCb"ARITLIB SRCbBINDEZ DOCbBINDEZ2 SRCb)BINDEZ1 SRCb>PRINT DOCb RPRINT SRCb\FSCROLL DOCb!FSCROLL SRCbBITMAP DOCb#BITMAP SRCb KREISE DOCb8KREISE SRCb.MAPPER DOCb%<MAPPER SRCbaWANDEL DOCbtWANDEL SRCbCUSTOM DOCb$CUSTOM SRCbLIESMICHDOCldverschiebung an sich wird durch zwei verschiedene Massnahmen erreicht: 1.) Veraenderung der Anfangsadresse des Video-Speic5r}hers. Wird diese Adresse (die sich in den sog. LMS-Bytes in der Display-List be- findet) um den Wert der Zeilen- laenge des j5s}eweiligen Graphikmodus vergroessert oder verkleinert, so entspricht das einer Verschiebung des Bildes nach oben bzw. unten. D5t}a diese Art des Scrollings recht ruckig ist nennt man sie 'Grob-Scrolling' (Coarse Scrolling). 2.) Wenn man in der Display-L5u}ist- Anweisung einer Bildschirmzeile das Bit 5 (das sog. VSCROL-Bit), auf Eins setzt, dann kann diese Zeile durch das Hardwar5v}e-Register VSCROL ($D405) fein verschoben werden. Fein verschoben heisst, dass die kleinsten Einheiten der Verschiebung jetzt5w} die einzelnen Punkte sind, aus denen ein Zeichen besteht (den sog. Pixels). Nachteil dieses 'Fein-Scrollings' ist aller- din5x}gs, dass diese Verschiebung nur max. 15 Pixels weit reicht. Sie sehen, um eine vernuenftige Bildverschiebung zustande zu bri5y}ngen, muessen diese beiden Methoden kombiniert werden. FSCROLL INTERN -------------- Das Hauptprogramm FSRCOLL wird vom VB5z}I alle 1/50 sec. aufgerufen und fragt den Joystickport 1 ab. Wir erkannt, dass der Stick nach oben bzw. nach unten gezogen wu5{}rde, so kommt das entsprchende Unter- programm OBEN bzw. UNTEN zum Zuge. In diesen beiden Unterprogrammen wird zuerst geprue5|}ft, ob in der gewuenschten Richtung schon das Ende des Scroll-Bereiches erreicht ist. Ist das nicht der Fall, so wird eine Fe5}}inverschiebung des Bildes versucht. Reicht diese nicht mehr aus (s. o.), so wird die LMS-Adresse um den Wert der Zeilenlaenge5~} (im Beispiel 20) erhoeht bzw. vermindert. OLL.SRC ===================================== D4K******************************** *Vertikales Fein-Scrolling * in Maschinensprache * * fuer ATMAS-II * * 9} Peter Finzel '85 ******************************** * * Konstante * YMIN EQU $E000 YMAX EQU $E000+3840 Scroll-Bereich=192 Ze9}ilen VSMAX EQU 15 Maximalwert des Fein-Scroll Reg. ZLAENG EQU 20 Zeilenlaenge in Byte MOD EQU 7+$20 ANTIC Modus 7 und Vscro9}ll-Bit * * Operating System * SDLSTL EQU $0230 Shadowreg. Displaylistadresse STICK0 EQU $0278 Shadow f. Joystick Nr. 0 SETV9}BV EQU $E45C Routine f. Interruptvekoren XITVBV EQU $E462 Abschluss des VBI * * Hardware * VSCROL EQU $D405 Register f. ve9}rtikale Verschiebung * ******************************** *Programm-Einsprung ******************************** ORG $A800 9}im res. Bereich * JMP VSINIT Sprung zum MP-Anfang * ******************************** *Display-List f. Scrollendes *'GRAP9}HICS 2'-Display ******************************** * DLIST DFB $70,$70,$70 ;3 Leerzeilen DFB MOD+$40 ;erste Zeile mit LMS-B9}it LMSADR DFW YMIN ;Adresse Bildspeicher DFB MOD,MOD,MOD,MOD DFB MOD,MOD,MOD,MOD DFB MOD,MOD,MOD,MOD-$20 * *Acht9}ung: letzte Zeile immer ohne Vscrol-Bit. * DFB $41 ;ANTIC JMP-Anweisung DFW DLIST ;zum Anfang der Disp.-List * * Int9}erne Variable * SVSCR DFB 0 ;Shadow fuer VSCROL * ******************************** *Initialisierungsroutine zum *Einrichten 9}der neuen Disp.-List *und der VBI-Routine ******************************** * VSINIT LDA #YMIN:L LMS-Adresse auf STA LMSAD9}R Anfang des Bildspeichers LDA #YMIN:H richten STA LMSADR+1 LDA #DLIST:L neue Disp.-List STA SDLSTL einrich9}ten LDA #DLIST:H STA SDLSTL+1 LDA #0 Fein-Scrolling in Ausgangs- STA VSCROL position STA SVSCR au9}ch Schattenregister! LDY #VSVBI:L Scroll-Routine in LDX #VSVBI:H den VBI einfuegen LDA #7 deferred VBI genue9}gt JSR SETVBV ohne Kommentar... RTS * ******************************** *VBI-Routine f. vert. Scrolling ************9}******************** * VSVBI CLD wer rechnet schon dezimal? LDA STICK0 hat jemand am Knueppel gezogen?! AND #19} etwa nach oben? BNE TSTUNT nein, aber vielleicht nach unten?--> * JSR OBEN Bildschirm nach oben scrollen>>>9} JMP VBIEND Fertig!===> * TSTUNT LDA STICK0 Freudenknueppel Nr.0 AND #2 nach unten gezogen? BNE VBIEND nic9}hts los ---> * JSR UNTEN nach unten scrollen>>> * VBIEND LDA SVSCR Schattenregister Fein-Scrolling STA VSCROL in H9}ardwarereg. uebertragen JMP XITVBV Ende der Vorstellung. * ******************************** * UP Bildschirm nach oben **9}****************************** * OBEN LDA SVSCR Zeichengrenze? BNE OB1 nein, kein Anschlag zu befuerchten * LDA 9}LMSADR sind wir schon CMP #YMAX:L am oberen Anschlag? BNE OB1 nein, Scrolling moeglich--> * LDA LMSADR+1 MSB9} ueberpruefen CMP #YMAX:H BEQ OBEND Anschlag erreicht, kein Scrolling--> * OB1 INC SVSCR zuerst Fein-Scrolling ve9}rsuchen LDA SVSCR CMP #VSMAX+1 Grob-Scrolling noetig? BCC OBEND nein, Fein-Scr. genuegt --> * LDA #0 F9}ein-Scr. ruecksetzen STA SVSCR CLC Grob-Scrolling vorbereiten LDA LMSADR Bildschirmadresse neu ADC #9}ZLAENG berechnen (eine Zeile STA LMSADR nach oben) BCC OBEND INC LMSADR+1 MSB OBEND RTS * *********************9}*********** * UP Bildschirm nach unten ******************************** * UNTEN LDA SVSCR Zeichengrenze? BNE UN1 nein9}, kein Anschlag zu befuerchten * LDA LMSADR sind wir schon CMP #YMIN:L am unteren Anschlag? BNE UN1 nein, Sc9}rolling moeglich--> * LDA LMSADR+1 MSB ueberpruefen CMP #YMIN:H BEQ UNEND Anschlag erreicht, kein Scrolling--> 9}* UN1 DEC SVSCR zuerst Fein-Scrolling versuchen BPL UNEND Fein-Scr. genuegt --> LDA #VSMAX Fein-Scr. ruecksetzen9} STA SVSCR SEC Grob-Scrolling vorbereiten LDA LMSADR Bildschirmadresse neu SBC #ZLAENG berechnen (ei9}ne Zeile STA LMSADR nach unten) BCS UNEND DEC LMSADR+1 UNEND RTS * fuer ATMAS-II * * 8`===================================== Dokumentation zu BITMAP.SRC ==================================}==== BITMAP ist ein nettes Graphik-Demo, das direkt von einem BASIC-Programm umgesetzt wurde. Einige der benutzten Graphik=}-Routinen kennen Sie bereits von den 'GRAFLIB'- Makros der ATMAS-Diskette, jedoch werden sie in diesem Beispiel als Unterprog=}ramme und nicht als Makros verwendet. Zusaetzlich ist noch der FILL-Befehl enthalten (einigen BASIC- Programmieren als XIO 18=}... bekannt). PROGRAMM STARTEN: ----------------- Laden Sie BITMAP.SRC in den Editor, assemblieren Sie es, und starten Sie=} es schliesslich im Monitor mit 'G'oto A800 Wenn Sie sich an der Graphik satt- gesehen haben, druecken Sie , um wie=}der in den Editor zurueck zu gelangen. EINIGE ANMERKUNGEN: ------------------- Sie sehen, der Uebergang von BASIC auf ein =}Maschinenprogramm muss gar nicht so schwer sein. Damit Sie die Umsetzung verfolgen koennen, wurden die BASIC-Befehle als Komm=}entar in das Assemblerlisting eingefuegt. Eine Besonderheit sollten Sie noch wissen: Um das Programm nicht un- noetig aufzub=}laehen, wurden nur X-Positionen von 0 bis 255 zuge- lassen, so dass ein GR.8 Bildschim nicht vollstaendig angesprochen werden=} kann. Fuer alle anderen Graphik-Modi ist dieser Zahlenbereich vollkommen ausreichend. DAS FILL-UNTERPROGRAMM -------------=}--------- Da das FILL-Kommando des Atari-Be- triebssystem doch recht eigenwilliger Natur ist, soll hier kurz darauf eingegan=}gen werden: (3) *--------* (2) I I I I I I I =} I (4) * * (1) Mit FILL kann man ausgefuellte Vierecke jeglicher Art erzeugen. Gehen Sie dazu w=}ie oben angedeutet vor: zuerst den Punkt (1) plotten, dann eine Linie nach (2) zeichen, eine weitere Linie nach (3) und schli=}esslich das FILL-UP mit den Koordinaten des Punktes (4) aufrufen. Das Viereck wir nun von oben nach unten und von links nach =}rechts mit Farbe gefuellt. Dem FILL-UP muss noch einen Farbcode (durch den Akku) mitgegeben werden, mit dem die Flaeche gefue=}llt wird. Verwenden Sie hier die gleichen Codes wie in den COLOR-Befehlen von BASIC. =}entation zu BITMAP.SRC =================================<6*********************************** * * Bit-Map-Graphik * in Maschinensprache * *****************************A}****** * * IOCB-Struktur: * ICCOM EQU $342 ICSTA EQU $343 ICBAL EQU $344 ICBAH EQU $345 ICBLL EQU $348 ICBLH EQU $349 ICAX1 EA}QU $34A ICAX2 EQU $34B CIOV EQU $E456 CIO-Vektor * CIO-Befehle COPEN EQU 3 CCLSE EQU 12 CPBIN EQU 11 hier: PLOT CA}DRAW EQU $11 DRAWTO CFILL EQU $12 XIO 18 * ATARI Graphik-Variable ATACHR EQU $2FB Farbe f. Draw FILLDAT EQU $2FD A} Farbe fuer Fill ROWCRS EQU $54 Cursor- COLCRS EQU $55 Position RTCLK EQU $12 Frame-Zaehler VCOUNT EQU $D40B RA}aster-Zeile WSYNC EQU $D40A Synchronisierung COLPF0 EQU $D016 Farbregister * Konstante des Demo-Programmes MX EQU 79 A} Mittelpunkt X MY EQU 47 Mittelpunkt Y SCHRITT EQU 5 Schrittweite ORG $A800 im res. Bereich *****************A}******************** * 'Mandala' * * Demo-Programm zeichnet einen * * Hyperbel-Koerper * *******************A}****************** * * GRAPHICS 7+16 * START LDA #7+16 GRAPHICS 7, JSR GRAPHICS ganzen Screen * * COLOR 3:PLOT 126,95 * LDAA} #3 STA ATACHR COLOR 3 LDX #126 Rechteck ausfuellen, LDY #95 in das die JSR PLOT Figur gezeichnet wird * * DRAWTO 126,A}0:DRAWTO 32,0 * LDX #126 LDY #0 JSR DRAW LDX #32 LDY #0 JSR DRAW * * POKE 765,3:POSITION 32,95:XIO18,#6,0,0,"S:" * (wirA}d durch FILL etwas eleganter) * LDA ATACHR Farbe wie DRAW LDX #32 LDY #95 JSR FILL * * COLOR 1: FOR LAUF=MY TO ... * LDAA} #1 COLOR 1 STA ATACHR LDA #MY Schleife vor- STA LAUF bereiten * * PLOT MX-LAUF,MY * FORNXT LDA #MX Beginn der SEC SA}chleife SBC LAUF TAX LDY #MY JSR PLOT * * DRAWTO MX,LAUF * LDX #MX LDY LAUF JSR DRAW * * DRAWTO MX+LAUF,MY * LDY #MY A} LDA #MX CLC ADC LAUF TAX JSR DRAW * * DRAWTO MX,MY+MY-LAUF * LDA #MY ASL ;statt MY+MY SEC SBC LAUF TAY LDX #MX JA}SR DRAW * * DRAWTO MX-LAUF,MY * LDA #MX SEC SBC LAUF TAX LDY #MY JSR DRAW * * ... TO 0 STEP SCHRITT: NEXT LAUF * (BeendA}ung derFOR-NEXT Schleife) * LDA LAUF Laufvariable SEC SBC #SCHRITT Schritt STA LAUF abziehen BCS FORNXT noch nicht ferA}tig-> * * Zur Abrundung der Graphik noch einen * Regenbogen im Hintergrund * (der im BASIC-Pgm nicht enthalten ist) * REGBOG A}LDA VCOUNT Raster-Zeile CLC plus ADC RTCLK+2 Frame-Zaehler STA WSYNC in STA COLPF0+4 Farbregister JMP REGBOG LAUF DFB A}0 Laufvariable ************************************* * GRAPHICS-Unterprogramm * * Aufruf: JSR GRAPHICS * * PARAMETER: * A}0 bis 15 (XL/XE) * 0 bis 11 (400/800) ************************************* GRAPHICS PHA Graphik-Stufe merken LDX #$60A} IOCB Nr. 6 LDA #CCLSE Screen-IOCB zuerst STA ICCOM,X schliessen JSR CIOV PLA Graphik-Stufe STA ICAX2,X zurueckholen A}AND #$F0 und passende EOR #$10 Bit-Kombination ORA #$0C fuer Handler STA ICAX1,X herstellen LDA #COPEN jetzt den BefehA}l STA ICCOM,X zum Oeffen des Screens LDA #SDEVICE Zeiger auf Device- STA ICBAL,X bezeichnung LDA #SDEVICE/256 STA ICBAH,A}X JMP CIOV RTS SDEVICE ASC "S:" Display-Handler ************************************* * Positionierung des Cursors * * A}Aufruf: JSR POSITION * * PARAMETER: * , je nach Graphikstufe ************************************* POSITION STX COLCRSA} Parameter in STY ROWCRS Database des LDA #0 Display-Handlers STA COLCRS+1 eintragen (ACHTUNG: RTS X nur bis 255!!) *A}************************************ * Graphik-Punkte setzen * * Aufruf: JSR PLOT * * PARAMETER: * , je nach GraphikstuA}fe ************************************* PLOT JSR POSITION LDX #$60 Screen-IOCB LDA #CPBIN Plot geht wie STA ICCOM,X 'PUA}T CHAR.' LDA #0 nur ein STA ICBLL,X Datum STA ICBLH,X LDA ATACHR Aktuelle Farbe JSR CIOV RTS ************************A}************* * Graphik-Linien ziehen * * Aufruf: JSR DRAW * * PARAMETER: * , je nach Graphikstufe ********************A}***************** DRAW JSR POSITION LDX #$60 Screen-IOCB LDA #CDRAW Draw-Befehl STA ICCOM,X in IOCB JSR CIOV RTS ****A}********************************* * FILL zum Ausfuellen von Flaechen * * Aufruf: JSR FILL * * PARAMETER: * : Farbe *A} , : je nach Graphikstufe ************************************* FILL STA FILLDAT Farbe fuer Fill JSR POSITION LDX #$A}60 Screen-IOCB LDA #CFILL Fill-Befehl STA ICCOM,X JSR CIOV RTS ***********************@f===================================== Dokumentation zu KREISE.SRC ===================================E}== Haben Sie schon versucht, Kreise in BASIC auf den Bildschirm zu zeichen? Wenn ja, dann wissen Sie, dass man dabei am bestE}en den Kaffe holt, Zigarette besorgen geht, oder den fehlenden Schlaf der letzten am Computer verbrachten Nacht nachholt. InE} Maschinensprache geht natuerlich alles schneller und besser, warum soll's mit dem Kreisemalen nicht genauso sein? Bevor einE} Kreis am Bildschirm er- scheinen will, muss man gewoehnlich schon etwas an Mathematik aufbieten. Entweder strapaziert man diE}e Kreis- gleichung und kommt dem Kreis mit Wurzeln auf die Spur, oder man macht's mit Hilfe von trigono- metrischen FunktioneE}n, sprich Sinus und Kosinus. Jedem Assemblerprogrammierer wird inzwischen der Mut vergangen sein, denn mit Wurzeln oder gar E}einem Sinus will man sich in Assembler wirklich nicht herumschlagen. Schliesslich hat man auch ohne Sinus schon genug ProblemE}e. Es geht auch ohne ----------------- Eine wirklich hochinteressante Methode zum Zeichnen von Kreisen habe ich im BASIC XE}L-TOOLKIT (von OSS) entdeckt. Damit ist es moeglich, einen Kreis nur mit Hilfe von Additionen und Subtraktionen zu berechnen.E} Das Pogramm arbeitet mit einer Naeherungsformel fuer einen Achtel-Kreisbogen, der ganze Kreis wird dann durch Spiegelung dieE}ses Bogens erzeugt. Am Ende dieses Files finden Sie das BASIC-Programm als Anhang. Da ich vor gar nicht zurueckschrecke, haE}be ich dieses Programm sogleich in Assembler umgesetzt, und, Sie werden es sehen, was herausgekommen ist tatsaechlich beeindrE}uckend. High-Speed PLOT =============== Wuerde man jetzt mit diesem wirklich schnellen Kreis-Algoritmus die PLOT Routine dE}es Betriebssystems ver- wenden, so hiesse das einen Porsche mit Goggomotor zu fahren. Nein, hier musste schon eine super- scE}hnelle PLOT-Routine her. Die finden Sie in dem UP PLOT, es arbeitet mit allen Zwei-Farb Graphikmodi (GR.4,6, 8,14) und geht, E}da es mit Tabellen arbeitet, recht flott. Die geplotteten Punkte werden Ex- klusiv-Oder verknuepft, d.h. wenn Sie einen PunkE}t auf ein bereits gesetztes Pixel plotten, so wird dieses ge- loescht. Auf diese Art koennen Sie einen Kreis einfach durch noE}chmaliges Zeichnen wieder vom Bildschirm ent- fernen. DEMO ==== Im Demo-Programm werden Ihnen die Faehigkeiten dieser KreiE}s-Routine anschaulich gezeigt: Sie koennen einen Kreis mit dem Joystick ueber den Bildschirm bewegen. Die Groesse des KreisesE} koennen Sie mit dem Feuerknopf veraendern. Benutzt wird die Graphikstufe 6, die die gleiche Aufloesung wie GR.7 besitzt, nuE}r eben mit zwei Farben arbeitet. Sie koennen auch mal GR. 14 versuchen, nur bekommen Sie dann 'Eier' statt Kreise, da die PixE}els nicht mehr quadratisch sind. Hier noch das Basic-Programm: ----------------------------- 10 PHI=0:RADIUS=30 20 MX=79E}:MY=47 30 X=RADIUS:Y=0 100 GRAPHICS 6+16:COLOR 1 110 PLOT (MX+X,MY+Y) 120 PLOT (MX+X,MY-Y) 130 PLOT (MX-X,MY+Y) 140 PLOT (MXE}-X,MY-Y) 150 PLOT (MX+Y,MY+X) 160 PLOT (MX+Y,MY-X) 170 PLOT (MX-Y,MY+X) 180 PLOT (MX-Y,MY-X) 200 PHIY =PHI+Y+Y+1 210 PHIXY=PHE}IY-X-X+1 220 PHI =PHIY 230 Y =Y+1 240 IF ABS(PHIXY)>ABS(PHIY) THEN PHI=PHIXY:X=X-1 250 IF Y<=X THEN 110 290 GOTO 290 E} Die einzelnen Befehle sind im Assemblerprogramm als Kommentar angegeben, so dass Sie sich leichter zurechtfinden. Noch ein E}Tip zum Schluss: Interessant ist dieses Programm auch in GR. 8, aber dazu reicht der reservierte Speicherplatz ab $A800 nichtE} aus. Waehlen Sie daher mit dem CUSTOMIZER (Beschreibung siehe CUSTOM.DOC) den EXTEND-Modus an, aendern Sie ORG auf $9000 undE} ZLAENGE auf 40, den GR.8 hat ja 40 BYTES pro Zeile. Gestartet wird das PGM dann mit G9000 im Monitor. Schliesslich koennen SE}ie XMAX (achtung, nur bis 255!)und YMAX noch vergroesern, um mehr Bewegungsfreiheit zu bekommen. Sie werden staunen, wie schE}nell besonders die kleineren Kreise ueber den Bildschirm flitzen. ================================D]*********************************** * High-Speed Kreise * * in Maschinensprache ****************************I}******* * * IOCB-Struktur, CIO-Befehle... * ICCOM EQU $342 ICBAL EQU $344 ICBAH EQU $345 ICAX1 EQU $34A ICAX2 EQU $34B CIOV EI}QU $E456 CIO-Vektor COPEN EQU 3 CCLSE EQU 12 * * Betriebssystem-Variable * SAVMSC EQU $58 Bildschirm-Adresse STICK0 I}EQU $278 Joystick 0 STRIG0 EQU $284 Trigger 0 * * Konstante des Demo-Programmes * MX EQU 79 Mittelpunkt X MY EQU I}47 Mittelpunkt Y RADMAX EQU 79 max. Radius YMAX EQU 96 Aufloesung vert. XMAX EQU 160 Aufloesung hor. ZLAENI}GE EQU 20 Bytes pro Zeile * * Zeropage-Variable * ZEIGER EQU $D4 Zeropage fuer PLOT XLAUF EQU $D6 X-Laufvariable I}YLAUF EQU $D7 Y-Laufvariable PHI EQU $D8 Variable fuer PHIY EQU $DA Naeherung PHIXY EQU $DC APHIY EQU $DE AbsI}olutwert PHIY APHIXY EQU $E0 Absolutwert PHIXY MXLAUF EQU $E2 Laufvariable MP MYLAUF EQU $E3 RADIUS EQU $E4 LaufvI}ariable Radius ORG $A800 im res. Bereich ************************************* * Demo-Programm: Ein beliebig grosser * KreI}is kann mit dem Jostick am * Schirm bewegt werden. ************************************* * * GRAPHICS 6+16 * START LDA #6+16 J}GRAPHICS 7, JSR GRAPHICS ganzen Screen JSR PLOTAB Tabellen... LDA #MX STA MXLAUF LDA #MY STA MYLAUF LDA #45 Vorgabe fJ}. STA RADIUS DEMO JSR KREIS Kreis zeichen * * Joystick oder Knopf aktiv * WARTEN LDA STICK0 Stick 0 CMP #15 bewegt? BNE J}KRSNEU ja --> LDA STRIG0 Knopf gedr. BNE WARTEN nein-- * * wenn Joystick bewegt wurde, dann * zuerst den alten Kreis loeschJ}en * KRSNEU JSR KREIS Kreis loeschen LDA STICK0 AND #8 BNE LINKS INC MXLAUF JMP UNTEN LINKS LDA STICK0 AND #4 BNE UNTJ}EN DEC MXLAUF UNTEN LDA STICK0 AND #2 BNE OBEN INC MYLAUF JMP TRIGGER OBEN LDA STICK0 AND #1 BNE TRIGGER DEC MYLAUF *J} * mit dem Feuerknopf kann der Radius * veraendert werden. * TRIGGER LDA STRIG0 AND #1 BNE SCHLUSS INC RADIUS LDA RADIUS J} CMP #RADMAX zu gross? BCC SCHLUSS nein--> LDA #3 min. Radius STA RADIUS SCHLUSS JMP DEMO ******************************J}******* * Dieses Unterprogramm zeichnet einen * Kreis mit: * * RADIUS: Radius des Kreises * MXLAUF: Mittelpunkt X-Koord. * MYJ}LAUF: Mittelpunkt Y-Koord. ************************************* KREIS LDA RADIUS STA XLAUF LDA #0 STA YLAUF STA PHI STJ }A PHI+1 * PIXEL JSR SPIEGEL JSR APPROX * * Until YLAUF>XLAUF * LDA XLAUF CMP YLAUF BCS PIXEL RTS **********************J }*************** * Naeherung fuer 1/8-Kreissektor ************************************* * * PHIY=PHI+YLAUF+YLAUF+1 * APPROX LDJ }A PHI+1 STA PHIY+1 CLC LDA PHI ADC YLAUF BCC APRX1 INC PHIY+1 APRX1 CLC ADC YLAUF BCC APRX2 INC PHIY+1 APRX2 STA PHIJ }Y INC PHIY BNE APRX3 INC PHIY+1 * * PHIXY=PHIY-XLAUF-XLAUF+1 * APRX3 LDA PHIY+1 STA PHIXY+1 SEC LDA PHIY SBC XLAUF BCJ }S APRX4 DEC PHIXY+1 APRX4 SEC SBC XLAUF BCS APRX5 DEC PHIXY+1 APRX5 STA PHIXY INC PHIXY BNE APRX6 INC PHIXY+1 * * PHI=J}PHIY * APRX6 LDA PHIY LDX PHIY+1 STA PHI STX PHI+1 * * YLAUF=YLAUF+1 * INC YLAUF * * Absolutwerte von PHIXY und PHIY * LJ}DX #PHIXY LDY #APHIXY JSR ABSOLUT LDX #PHIY LDY #APHIY JSR ABSOLUT * * IF ABS(PHIXY)=' * * PHI=PHIXY:XLAUF=XLAUF-1 * LDA PHIXY LDX PHIXY+1 SJ}TA PHI STX PHI+1 DEC XLAUF * GRGLCH RTS ************************************ * Acht Spiegelungen des Kreisbogens * plottenJ} ************************************ * * PLOT MX+XLAUF, MY+YLAUF * SPIEGEL LDA MXLAUF CLC ADC XLAUF TAX LDA MYLAUF CLC J} ADC YLAUF TAY JSR PLOT * * PLOT MX-XLAUF, MY+YLAUF * LDA MXLAUF SEC SBC XLAUF TAX LDA MYLAUF CLC ADC YLAUF TAY JSJ}R PLOT * * PLOT MX+XLAUF, MY-YLAUF * LDA MXLAUF CLC ADC XLAUF TAX LDA MYLAUF SEC SBC YLAUF TAY JSR PLOT * * PLOT MX-J}XLAUF, MY-YLAUF * LDA MXLAUF SEC SBC XLAUF TAX LDA MYLAUF SEC SBC YLAUF TAY JSR PLOT * * PLOT MX+YLAUF, MY+XLAUF * J}LDA MXLAUF CLC ADC YLAUF TAX LDA MYLAUF CLC ADC XLAUF TAY JSR PLOT * * PLOT MX-YLAUF, MY+XLAUF * LDA MXLAUF SEC SBJ}C YLAUF TAX LDA MYLAUF CLC ADC XLAUF TAY JSR PLOT * * PLOT MX+YLAUF, MY-YLAUF * LDA MXLAUF CLC ADC YLAUF TAX LDA MJ}YLAUF SEC SBC XLAUF TAY JSR PLOT * * PLOT MX-YLAUF, MY-YLAUF * LDA MXLAUF SEC SBC YLAUF TAX LDA MYLAUF SEC SBC XLAJ}UF TAY JSR PLOT RTS ************************************* * Berechnung des Absolutwertes * (Betrages) * * J}:Zeiger auf 16-Bit Integer des * der umzuwandelnden Zahl * :Zeiger auf Ergebnis (ebenfalls * 16-Bit Int.), beidJ}es sind * Zeiger in die Zerpage! * ************************************* ABSOLUT LDA 1,X Vorzeichen des MSB negativ? J}BMI ANEG negativ-> STA 1,Y positive Zahl LDA 0,X Absolutwert ist STA 0,Y die Zahl selbst RTS * * bei neg. Zahlen: ZahJ}l=0-Zahl * ANEG SEC LDA #0 zuerst das LSB SBC 0,X STA 0,Y LDA #0 und jetzt das MSB SBC 1,X STA 1,Y RTS *************J}************************ * GRAPHICS-Unterprogramm * * Aufruf: JSR GRAPHICS * * PARAMETER: * 0 bis 15 (XL/XE) * 0 bis J}11 (400/800) ************************************* GRAPHICS PHA Graphik-Stufe merken LDX #$60 IOCB Nr. 6 LDA #CCLSE ScreJ }en-IOCB zuerst STA ICCOM,X schliessen JSR CIOV PLA Graphik-Stufe STA ICAX2,X zurueckholen AND #$F0 und passende EOR #J!}$10 Bit-Kombination ORA #$0C fuer Handler STA ICAX1,X herstellen LDA #COPEN jetzt den Befehl STA ICCOM,X zum Oeffen desJ"} Screens LDA #SDEVICE Zeiger auf Device- STA ICBAL,X bezeichnung LDA #SDEVICE/256 STA ICBAH,X JMP CIOV RTS SDEVICE ASJ#}C "S:" Display-Handler ************************************* * HI-SPEED PLOT fuer Einfarb-Modi * * Aufruf: JSR PLOT * * PARJ$}AMETER: * , je nach Graphikstufe ************************************* PLOT CPY #YMAX Grenzen BCS PLOTEND pruefen CPJ%}X #XMAX BCS PLOTEND LDA ADRLO,Y Bildschirm- STA ZEIGER adresse LDA ADRHI,Y in Zeropage STA ZEIGER+1 TXA LSR ;geteilt J&} LSR ;durch 8 LSR TAY ;Index f. X-Pos TXA X-Position AND #7 TAX LDA PIXTAB,X Welches Pixel EOR (ZEIGER),Y und PixelJ'} manipulieren STA (ZEIGER),Y zurueck in Graphik PLOTEND RTS ************************************** * Erzeugt AdresstabelleJ(}n fuer Plot * * muss vor der ersten Verwendung von * Plot und nach dem GRAPHICS-Befehl * stehen! ****************************J)}*********** PLOTAB LDA SAVMSC Anfangsadresse STA ZEIGER des Video-Rams LDA SAVMSC+1 STA ZEIGER+1 LDY #0 Index auf 0 NXJ*}TADR LDA ZEIGER Adresstabellen STA ADRLO,Y aufbauen LDA ZEIGER+1 MSB-Tabelle STA ADRHI,Y CLC LDA ZEIGER Adresse des ADCJ+} #ZLAENGE naechsten Zeilen STA ZEIGER anfangs berechnen LDA ZEIGER+1 ADC #0 STA ZEIGER+1 INY CPY #YMAX schon f. alle ZeJ,}ilen? BNE NXTADR nein --> RTS * * ab hier stehen die Tabellen * PIXTAB DFB 128,64,32,16,8,4,2,1 ADRLO ORG *+YMAX Platz fuerJ-} ADRHI ORG *+YMAX Tabellen High-Speed Kreise * * in Maschinensprache ****************************H%===================================== Dokumentation zu MAPPER.SRC ====================================N/}= Mit MAPPER.SRC koennen Sie einen Blick hinter die Kulissen von professionellen Programmen und deren Kopierschutz werfen. N0}MAPPER liest jeden Sektor einer Single-Density Diskette ein, und gibt Ihnen durch eine Sektorkarte einen Uebersicht der DiskeN1}tte. Folgende Symbole werden verwendet: ---------------------------------- * : belegter Sektor : (Leerzeichen) leereN2}r Sektor M : Missing Sector (s. Text) C : CRC-Error (s. Text) B : Sonstiger 'Bad-Sector' Sie erhalten InformationenN3}, ob ein Sektor leer oder belegt ist, oder ob es sich um einen sog. 'BAD SECTOR' handelt. Die letzteren geben beim Lesen eineN4}n ERROR 144, der gerne fuer den Kopierschutz hergenommen wird. BAD SECTORS ----------- Bei einem BAD SECTOR wird Ihnen weitN5}erhin mitgeteilt, um welche Art von BAD SECTOR es sich dabei handelt. Moeglich sind sog. 'Missing Sectors', fehlende SektorenN6}, die z.B. entstehen, wenn ein Sektor mit zu hoher Drehzahl geschrieben wird, und daher den naechsten Sektor ueber- schreibt.N7} Zweite Moeglichkeit sind sog. 'CRC- Errors', die auf einen Fehler in der internen Pruefsumme hinweisen. Falls ein 'B' angeN8}zeigt wird, so handelt es sich ebenfalls um einen BAD SECTOR, der jedoch in die obigen Kategorien nicht einordnen laesst (z.BN9}. Data Flag). Das Einlesen einer Diskette kann bei vielen BAD SECTORS laenger dauern, da das Laufwerk bei Lese- fehlern mehrN:}mals versucht, den sektor doch noch zu lesen N;} Dokumentation zu MAPPER.SRC ====================================L'************************************ * SECTOR-MAPPER fuer Single-Density * * P. Finzel 1985 *******************************R=}***** MAXSEC EQU 721 Letzter Sector + 1 MINPOS EQU 2 Anfangs-Spalte MAXPOS EQU 38 End-Spalte +1 DRIVE EQU 1 Aktuelles LaufR>}werk EOL EQU $9B End-of-Line Zeichen ZEIGER EQU $80 Zeropage-Register SBUFFER EQU $600 Page 6 als Buffer LMARGIN EQU $52 R?} linker Rand COLCRS EQU $55 Cursor-Spalte ROWCRS EQU $54 Cursor-Zeile DVSTAT EQU $2EA Geraete-Status CONSOL EQU $D01F FuR@}ntionstasten KEYBDV EQU $E420 Keyboard-Handler EDITDV EQU $E400 Editor-Handler DSKINV EQU $E453 Disk-Handler-Einsprung * * DRA}BC-Kontrollblock * DDEVIC EQU $300 DUNIT EQU $301 DCOMND EQU $302 DSTATS EQU $303 DBUFLO EQU $304 DBUFHI EQU $305 DBYTLO EQU RB}$308 DBYTHI EQU $309 DAUX1 EQU $30A DAUX2 EQU $30B * ORG $A800 im res. Bereich * SMAPPER LDA #0 Linker Rand STA LMARGIN auRC}f Null LDA #$7D Clear Screen JSR SCROUT LDA #$80 inverse Ausgabe STA INVREG JSR PRINT ASC \Sector-Mapper PRD}.Finzel 1985\ LDA #EOL JSR SCROUT LDA #EOL JSR SCROUT JSR PRINT ASC \TR012345678901234567012345678901234567\ LDA #EOL RE} JSR SCROUT JSR PRINT ASC "0002040608101214" ASC "1618202224262830" ASC \32343638\ * * auf START-TasteRF} warten * JSR START LDX #7 LDY #23 JSR POSITION JSR PRINT ASC \ Diskette wird gelesen \ LDA #0 STA INVREG LDY #1 STRG}Y SECNUM DEY STY SECNUM+1 LDA #2 STA SPALTE LDA #3 STA ZEILE CHKSEC JSR READSEC BMI ERRSEC Fehler--> * * Auswertung deRH}r gelesenen Daten * LDX #$7F 128 Bytes pro Sector LDA #0 SECLEER ORA SBUFFER,X DEX BPL SECLEER CMP #0 BEQ LEER LDA #'RI}* Merker 'Voller Sektor' JMP NXTSEC LEER LDA #$20 Leerzeichen JMP NXTSEC * * DISK-FEHLER: Hardware-Status des * RJ} Disk-Contollers abfragen * ERRSEC JSR STATUS Disk-Status LDA DVSTAT+1 Status des Disk-Cont. AND #8 CRC-Error? BNE NOCRK}RC nein--> LDA #'C Merker fuer CRC JMP NXTSEC NOCRC LDA DVSTAT+1 AND #16 'Missing Sector' BNE NOMISS nein--> LDA #'RL}M JMP NXTSEC NOMISS LDA #'B sonst. 'Bad Sector' * * den ermittelten Merker ausdrucken * NXTSEC PHA Merker aufheben LDX SRM}PALTE LDY ZEILE JSR POSITION PLA JSR SCROUT INC SECNUM naechsten Sektor BNE NXTS1 INC SECNUM+1 NXTS1 INC SPALTE LDA SRN}PALTE CMP #MAXPOS naechste Zeile? BNE NXTS2 INC ZEILE LDA #2 STA SPALTE NXTS2 LDA SECNUM CMP #MAXSEC:L BNE NXTS3 LDA RO}SECNUM+1 CMP #MAXSEC:H BEQ ENDE fertig--> NXTS3 JMP CHKSEC * * auf START-Taste warten * ENDE JSR START JMP SMAPPER Neu staRP}rten RTS ************************************* * Bereit-Meldung, START-Taste ************************************* START LDRQ}X #0 LDY #23 JSR POSITION LDA #$80 STA INVREG JSR PRINT ASC \ Bitte START druecken \ LDA #8 STA CONSOLRR} * * Auf START-Taste warten * WARTE LDA CONSOL AND #1 BNE WARTE GEDRKT LDA CONSOL immer noch AND #1 gedrueckt? BEQ GEDRKRS}T ja --> RTS ************************************* * Sektor in SBUFFER einlesen ************************************* READRT}SEC LDA #DRIVE Drive 1 STA DUNIT LDA #'R Sektor lesen STA DCOMND LDA #$40 Status fuer STA DSTATS lesen LDA #SBUFFER:LRU} STA DBUFLO LDA #SBUFFER:H STA DBUFHI LDA #$80 128 Bytes STA DBYTLO LDA #0 STA DBYTHI LDA SECNUM Nummer des STA DAURV}X1 Sektors in LDA SECNUM+1 AUX-Bytes STA DAUX2 JSR DSKINV RTS ************************************* * Status von Disk-DRW}rive anfordern ************************************* STATUS LDA #DRIVE STA DUNIT LDA #'S STA DCOMND JSR DSKINV RTS *RX}************************************ * Interne Variable ************************************* SECNUM DFW 0 aktuelle SektornuRY}mmen ZEILE DFB 0 momentane Zeile SPALTE DFB 0 momentane Spalte INVREG DFB 0 fuer PRINT: Invers *****************************RZ}******** * Das PRINT-Unterprogramm * * Modifiziert zum Ausdruck von * inversen Zeichen. * Hierzu muss zuvor INVREG auf $80 * R[}gesetzt werden. ************************************* PRINT PLA STA ZEIGER PLA STA ZEIGER+1 LDX #0 PRINT1 INC ZEIGER BNR\}E *+4 INC ZEIGER+1 LDA (ZEIGER,X) AND #$7F ORA INVREG JSR SCROUT LDX #0 LDA (ZEIGER,X) BPL PRINT1 LDA ZEIGER+1 PHA R]} LDA ZEIGER PHA RTS ************************************** * Ein Zeichen ausgeben * ************************R^}************** SCROUT TAY simuliert LDA EDITDV+7 einen indirekten PHA Sprung nach LDA EDITDV+6 der SCROUT-Routine PHA R_} im OS-ROM TYA RTS ************************************* * POSITION-ROUTINE ************************************* POR`}SITION STX COLCRS STY ROWCRS LDX #0 STX COLCRS+1 RTS *****************Pl===================================== Dokumentation zu WANDEL.SRC ===================================Vb}== Dieses Utility erlaubt die Kon- vertierung von Quellfiles anderer Assembler in das ATMAS-Format. Verwendbare Quellfiles:Vc} * Atari-Editor/Assembler Cartridge * MAC/65 Quellfiles (mit LIST gesp.) Vom MAC/65 koennen nur Files ueber- nommen werden,Vd} die mit LIST#D:FN.EXT abgespeichert wurden. Bedienung: ========== Laden Sie WANDEL.SRC von der TOOLBOX Diskette und assembVe}lieren Sie es. Nun loeschen Sie den Quelltext aus dem Textspeicher (mit $K$) und laden das zu konvertierende File. Von dieseVf}m wird Ihnen nun nur die erste Zeile angezeigt, keine Angst, das ist ganz normal. Nun starten Sie das vorhin assemblierte WanVg}del- Utility mit dem User-Befehl des Editors ($U$), oder, falls Ihnen das besser gefaellt, mit 'G'oto A800 im Monitor. Nach Vh}dem WANDEL seine Arbeit getan hat, koennen Sie den Text mit dem ATMAS-Editor weiter bearbeiten. Die Zeilennummern wurden bereVi}its auto- matisch entfernt, ebenso wurden Strichpunkte am Anfang einer Zeile in das ATMAS-Kommentarzeichen '*' gewandelt. MeVj}ist bleibt noch einige manuelle Arbeit zu tun: Unterschiedliche Assemblerdirektiven muessen noch geaendert werden. Das kann jVk}edoch mit dem ATMAS-Editor recht schnell geschehen: z.B. $S=$D$IEQU$ ersetzt z. B. alle '=' Anweisungen von MAC/65 QuellfiVl}les in die ent- sprechenden EQU-Direktiven des ATMAS- Assemblers. Hier noch eine kleine Tabelle als Uebersetzungshilfe: AtaVm}ri E/A, MAC/65 I ATMAS-II --------------------------------- I = I EQU *= Vn} I ORG .BYTE 10,20 I DFB 10,20 .BYTE "HUGO" I ASC "HUGO" .SBYTE "HUGO" I ASC %HUGO% .WOVo}RD I DFW .OPT LIST I OUT L .OPT NOLIST I OUT Interne Arbeitsweise: =====================Vp} WANDEL benutzt einige interne Routinen des ATMAS-Editors um den Cursor zu bewegen bzw. Zeichen aus dem Text zu loeschen. EbVq}enfalls werden einige interne Zeropage-Zeiger verwendet, die im Programm naeher erlaeutert werden. Wichtigste Funktion des WVr}andel- programmes ist das ersetzen der Atari-spezifischen EOL-Zeichen in ASCII-'Carriage Return' Zeichen. Dadurch wird der QuVs}elltext fuer ATMAS-II 'lesbar'. ntation zu WANDEL.SRC ===================================T6************************************* * SRC-CODE UMWANDLUNG ************************************* * Umwandlung von QuelZu}l-Codes * * -der Atari-Assembler Cartridge * -vom MAC/65 List-Files * * Bedienungsanleitung s. WANDEL.DOC * *************Zv}************************ FORWARD EQU $37AE Editor: Cursor weiter BACKSP EQU $36C9 Editor: Zeichen loeschen HOME EQU $3776 EdZw}itor: Cursor an Text-Anfang LPTR EQU $8D Zeiger auf Zeichen links vom Crs. RPTR EQU $8F Zeiger auf Zeichen rechts vom CrsZx}. TXTEND EQU $AF Zeiger auf Textende ORG $A800 START LDX #0 fuer Cursor-Routinen JSR HOME an Textanfang JSR ZNUMMER Zy}und Zeile wandeln WEITER LDA RPTR schon am Ende? BNE CHRDA nein --> LDA RPTR+1 CMP TXTEND BEQ ENDE CHRDA LDX #0 jetztZz} noch LDA (RPTR,X) das EOL am CMP #$9B Ende der Zeile BNE KEINEOL durch das ACII- LDA #$0D 'RETURN' Zeichen STA (RPTRZ{},X) ersetzen JSR FORWARD JSR ZNUMMER naechste Zeile wandeln JMP WEITER KEINEOL LDX #0 bisher kein JSR FORWARD EOL gefundZ|}en JSR FORWARD naechstes Zeichen JMP WEITER ENDE RTS ************************************* *UP Zeilenanfanang wandeln * Z}}* Die Zeilennummer und ein evtl. * Leerzeichen wird entfernt * Strichpunkt wird in Stern gewandelt **************************Z~}*********** ZNUMMER LDX #0 LDA (RPTR,X) CMP #'0 BCC ZLEER keine Zahl CMP #'9+1 BCS ZLEER JSR FORWARD JSR BACKSP JMPZ} ZNUMMER ZLEER CMP #$20 Lerrz.? BNE ZKOMM Nein --> JSR FORWARD JSR BACKSP ZKOMM LDX #0 LDA (RPTR,X) CMP #'; BNE ZAENZ}D Kein Kom.-> LDA #'* STA (RPTR,X) JSR FORWARD ZAEND RTS Z} SRC-CODE UMWANDLUNG ************************************* * Umwandlung von QuelX'===================================== Dokumentation zu CUSTOM.SRC ===================================^}== Dieses Dienstprogramm erlaubt Ihnen die Veraenderung der Speicherbelegung von ATMAS-II. Sie koennen den Text- bereich ode^}r das Kopierregister ver- groessern oder verkleinern, und damit den reservierten Bereich fuer Objektprogramme veraendern. In^} der Grundversion ist ATMAS-II fest konfiguriert, der fuer Maschinen- programme bestimmte Bereich beginnt bei $A800. Will man^} Speicherplatz- intensive Graphikmodi (GR.8, 14) verwenden, so reicht dieser Bereich nicht aus. Mit dem Customizer koennen Si^}e nun frei bestimmen, wieviel Platz Sie brauchen. SO FUNKTIONIERT'S: ================== CUSTOM.SRC laden, assemblieren und^} mit U }> starten. Nun wird Ihnen ein Menue praesentiert, mit dem Sie Anfangs- und Endadressen von Text-Buf^}fer und Kopier-Register sowie die Endadresse der Symboltabelle veraendern koennen. Mit 'X' koennen Sie einen voreingestellten^} 'Extended Code'-Modus waehlen, der die Anfangs- adresse des reservieren Bereiches von $A800 auf $9000 heruntersetzt. Damit h^}aben Sie ca. 11KByte Platz fuer Programme und Daten, genug um z.B. GRAPHICS 8 aufzurufen. Alle Adressangaben im Customizer s^}ind PAGE-Nummern, d.h. wenn Sie sich zwei Nullen dahinter denken, dann haben Sie die gesamte Adresse: PAGE $60 bedeutet Ad^}resse $6000 Wenn Sie die richtige Konfiguration eingestellt haben, druecken Sie und finden sich in ATMAS-II wieder. A^}CHTUNG: dabei werden der Textbuffer und das C-Register geloescht! KONFIGURATIONEN =============== Etwas Vorsicht s^}ollten Sie jedoch im Umgang mit dem Customizer walten lassen, da Ihre Eingaben nicht auf Richtigkeit geprueft werden. Sie koe^}nnten durchaus das Kopier-Register mitten in ATMAS-II selbst (von $2800 bis $4AFF) hinein verlegen, was natuerlich einen kata^}strophalen Absturz zur Folge haette. Um aehnliches zu vermeiden, sollten Sie sich zuerst die Memory-Map im ATMAS-Handbuch un^}d das folgende zu Gemuete fuehren: Diese Page-Nummern sollten Sie unbedingt vermeiden: $70 - $1F (DOS) $28 - $4B (ATM^}AS) $BC - $BF (Bildschirm) $C0 - $FF (OS-ROM !!!) Weiterhin sind Ueberscheidungen von einzelnen Bereichen nicht erlau^}bt. Von der Symboltabelle kann nur das Ende veraendert werden, sie beginnt immer nach ATMAS-II (ab $4C) Sonst ist alles erla^}ubt, was gefaellt. Sie koennen das Kopierregister in den Bereich von $20-$28 verschieben (wie im X-Modus), die Symboltabelle ^}verkuerzen, den Textbuffer verlaengern etc. etc. n zu CUSTOM.SRC ===================================\<************************************** * * * ATMAS-II CUSTOMIZER * * * * Peter Finzel 1985 b} * * ************************************** KEYBDV EQU $E420 Keyboard-Handler EDITDV EQU $E400 Editor-Handler AUX Eb}QU $80 Zeiger f. PRINT * * interne Zeiger von ATMAS-II * KOPANF EQU $AC Anfang Koierreg. KOPEND EQU $AD Ende " TXTANb}F EQU $AE Anfang Textbuffer TXTEND EQU $AF Ende " SYMEND EQU $331C Ende der Symboltabelle * * ATMAS-II Unterprogrammeb} * CLRKOP EQU $3861 Kopier-Reg. loeschen CLRTXT EQU $334A Text-Buffer loeschen, Editor starten * * wie immer im res. Bereich b}* ORG $A800 * CUSTOM LDA #$7D Bildschirm JSR SCROUT loeschen JSR PRINT ASC \ CUSTOMIZER FUER ATMAS-II V1.0\ JSR EOLb}OUT JSR PRINT ASC \------------------------------------\ JSR EOLOUT JSR EOLOUT JSR PRINT ASC \Bisherige Einstellung:\ Jb}SR EOLOUT JSR EOLOUT JSR EOLOUT JSR PRINT ASC \1 - Symboltabelle Ende: $\ LDA SYMEND JSR HEXOUT JSR EOLOUT JSR PRINT b} ASC \2 - Kopier-Reg. Anfang: $\ LDA KOPANF JSR HEXOUT JSR EOLOUT JSR PRINT ASC \3 - Kopier-Reg. Ende : $\ LDA KOPEND b} JSR HEXOUT JSR EOLOUT JSR PRINT ASC \4 - Text-Buffer Anfang: $\ LDA TXTANF JSR HEXOUT JSR EOLOUT JSR PRINT ASC \5 - b}Text-Buffer Ende : $\ LDA TXTEND JSR HEXOUT JSR EOLOUT JSR EOLOUT JSR PRINT ASC \------------------------------------\b} JSR EOLOUT JSR PRINT ASC \Alle Zahlen sind PAGE-Nummern!\ JSR EOLOUT JSR PRINT ASC \Symboltabelle beginnt bei $4C (fesb}t)\ JSR EOLOUT JSR EOLOUT JSR PRINT ASC \1-5 : Aenderung\ JSR EOLOUT JSR PRINT ASC \'N' : Norm-Werte\ JSR EOLOUT Jb}SR PRINT ASC \'X' : Extended Code Modus\ JSR EOLOUT JSR PRINT ASC \'ESC': Werte OK, zurueck zu ATMAS\ JSR EOLOUT JSR Eb}OLOUT JSR PRINT ASC \Ihre Wahl -->\ * * Warten auf Eingabe, Auswertung * JSR GETCHR JSR SCROUT CMP #$1B ist ESC? BEQ b}WERTOK ja --> * * Norm-Werte setzen? * CMP #'N BNE TESTEX nein --> LDA #$60 STA SYMEND STA KOPANF LDA #$64 STA KOPEND b} STA TXTANF LDA #$A8 STA TXTEND JMP CUSTOM * * Extended Code gewuenscht? * TESTEX CMP #'X BNE TEST1 nein--> LDA #$20 STb}A KOPANF LDA #$28 STA KOPEND LDA #$58 STA SYMEND STA TXTANF LDA #$90 STA TXTEND JMP CUSTOM * * Aendern der einzelnen b}Werte... * TEST1 CMP #'1 ist's '1'? BNE TEST2 nein--> JSR WERTEIN STA SYMEND JMP CUSTOM TEST2 CMP #'2 BNE TEST3 JSR Wb}ERTEIN STA KOPANF JMP CUSTOM TEST3 CMP #'3 BNE TEST4 JSR WERTEIN STA KOPEND JMP CUSTOM TEST4 CMP #'4 BNE TEST5 JSRb} WERTEIN STA TXTANF JMP CUSTOM TEST5 CMP #'5 BNE FALSCH falsche Eingabe JSR WERTEIN STA TXTEND FALSCH JMP CUSTOM * * nab}ch 'ESC' werden Text-Buffer und * Kopierregister geloescht * WERTOK LDX #0 JSR CLRKOP LDA #$1B ESC augeben JSR SCROUT LDb}X #0 JMP CLRTXT aktiviert ATMAS ************************************* * Eine PAGE-Adresse (hex) einlesen ******************b}******************* WERTEIN JSR EOLOUT JSR PRINT ASC \Neuer Wert: $\ JSR HEXIN RTS *************************************b} * Das PRINT-Unterprogramm ************************************* PRINT PLA STA AUX PLA STA AUX+1 LDX #0 PRINT1 INC AUX Bb}NE *+4 INC AUX+1 LDA (AUX,X) AND #$7F JSR SCROUT LDX #0 LDA (AUX,X) BPL PRINT1 LDA AUX+1 PHA LDA AUX PHA RTS ***b}*********************************** * Ein Zeichen ausgeben * * * : auszugebendes Zeichen * * ACHTUNG: JSR Eb}OLOUT --> neue Zeile ************************************** EOLOUT LDA #$9B EOL ausgebeb SCROUT TAY LDA EDITDV+7 PHA LDAb} EDITDV+6 PHA TYA RTS ************************************** * Ein Zeichen einlesen * * * * :enthaeb}lt Zeichen * ************************************** GETCHR LDA KEYBDV+5 simuliere PHA ;JMP GETCHR LDA KEYBDV+b}4 PHA RTS ************************************** * Bytewert in hex einlesen * ************************************** HEXb}IN LDX #0 STX EXPR STX EXPR+1 HIN1 JSR GETCHR JSR SCROUT CMP '0 BCC HIN4 CMP '9+1 BCC HIN2 CMP 'A BCC HIN4 CMP 'F+1b} BCS HIN4 SBC 'A-10-1 HIN2 ASL ASL ASL ASL LDX #4 HIN3 ASL ROL EXPR ROL EXPR+1 DEX BNE HIN3 BEQ HIN1 HIN4 LDA EXPRb} RTS EXPR DFW 0 ************************************** * Bytewert in hex ausgeben * ************************************b}** HEXOUT PHA LSR LSR LSR LSR JSR HOT1 PLA AND #%00001111 HOT1 CMP #10 BCS HOT2 ORA '0 BNE HOT3 HOT2 ADC 'A-10-1 HOb}T3 JSR SCROUT HOT4 RTS eter Finzel 1985 `i===================================== Einfuehrung in die Benutzung der ATMAS TOOLBOX ====f}================================= Bestimmt haben Sie beim Programmieren in Assembler schon festgestellt, dass das 'Rad oft f}neu erfunden' werden muss, d.h. man steckt wertvolle Zeit in Probleme, die mit grosser Sicherheit von anderen Programmieren sf}chon geloest wurden. Aus diesem Grund entstand die ATMAS TOOLBOX, in der Sie eine Menge MAKROS, UNTERPROGRAMME und auch Dienf}stpro- gramme fuer den ATMAS-II Assembler finden. So sind beispielsweise Makros zum Rechnen (Multiplizieren... ), zum Ausgebef}n von Zahlen, Unterpro- gramme zur Textausgabe und zur Erzeugung von Graphiken enthalten. Demos ===== Alle Files enthaltenf} ein Demoprogramm, so dass Sie jedes File, das den Extender .SRC hat, direkt mit ATMAS-II einlesen, assemblieren und im Monitf}or mit 'G'A800 starten koennen. Die einzelnen Quellfiles sind reichlich kommentiert, damit Sie die Arbeits- weise gut verfolgf}en koennen. Erlaeuterungen ============== Zusaetzlich ist zu jedem Quellfile eine Erlaeuterung auf der Diskette vorhanden,f} die Sie genauso wie diese Einfuehrung in den ATMAS-Editor laden und lesen koennen. Selbst- verstaendlich koennen Sie diese Tf}exte auch auf den Drucker ausgeben (mit L1). Diese Files haben jeweils den Namen des Quellfiles, nur der Extef}nder ist auf .DOC (fuer 'Dokument') geaendert. Einlesen z.B. mit RD:PRINT.DOC Das Inhaltsverzeichnis der f}Diskette bekommen Sie im Monitor mit 'I', aber das ist Ihnen ja schon aus dem ATMAS-Handbuch bekannt. EXTRAS ====== Ein paf}ar 'Schmankerl' sind schon auch enthalten. Da ware zunaechst die Wandelroutine, mit der Quell- text des Atari-Assembler-Modulf}s (und auch von MAC\65) in das ATMAS Format uebernommen werden kann. Dann haben wir den CUSTOMIZER, mit dem Sie die Speicheraf}ufteilung des ATMAS-II Systems aendern koennen und so mehr Platz fuer Text oder Objektcode reservieren koennen. Auch das KREf}IS-Programm ist eine Klasse fuer sich. Eine so flotte Routine zum Zeichen von Kreisen haben Sie bestimmt noch nicht gesehen. f} Sonst gibts noch den MAPPER zum Analysieren von geschuetzten Dis- ketten, Feinscrolling, ein nettes Graphik-Demo und einigesf} mehr... Viel Spass mit der ATMAS TOOLBOX wuenscht Ihnen PETER FINZEL Ӻ̾Š硠 f}n die Benutzung der ATMAS TOOLBOX ====d9